<?php

declare(strict_types=1);

namespace Zms\Validate\Rule;

use Zms\Unit\Is;

/**
 * 数组验证器
 *
 * 该类用于检查给定值是否为一个数组。它继承自 RuleAbstract，并提供了设置默认错误消息以及执行具体验证逻辑的方法。
 * 如果输入值是一个数组，则认为验证通过；否则，添加错误信息并返回 false。
 */
class ArrayValidate extends RuleAbstract
{
    /**
     * 默认错误消息
     *
     * 当验证失败时显示的错误消息。可以包含占位符 `{label}`，将在实际使用时替换为字段标签。
     *
     * @var string
     */
    protected $_error = '{label}数据类型错误';

    /**
     * 验证输入值是否为数组
     *Z
     * 如果输入值是一个数组，则记录该值并返回 true 表示验证通过。
     * 如果允许跳过空值并且值为空数组，则也直接通过验证。
     * 如果输入值不是数组，添加错误信息并返回 false。
     *
     * @param mixed $value 待验证的值
     * @param string $label 字段标签，用于错误提示信息中
     * @return bool 验证结果：成功为 true，失败为 false
     */
    public function validate($value, string $label = ''): bool
    {
        // 检查值是否为数组
        if (is_array($value)) {
            // 如果允许跳过空值并且值为空数组，则直接通过验证
            if (Is::empty($value) && $this->_noSkipping === true) {
                $this->_value = [];
                return true;
            }
            // 记录数组值并返回 true 表示验证通过
            $this->_value = $value;
            return true;
        }
        // 如果值不是数组，添加错误信息并返回 false
        return $this->addError($this->_error, $label);
    }
}